package pe.edu.sisclas.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;

import pe.edu.sisclas.model.domain.Aula;
import pe.edu.sisclas.model.domain.Curso;
import pe.edu.sisclas.model.domain.Incidencia;
import pe.edu.sisclas.model.domain.IncidenciaBackingBean;
import pe.edu.sisclas.model.domain.Laboratorio;
import pe.edu.sisclas.model.domain.Usuario;
import pe.edu.sisclas.model.service.AulaService;
import pe.edu.sisclas.model.service.IncidenciaService;
import pe.edu.sisclas.model.service.LaboratorioService;
import pe.edu.sisclas.model.service.exception.ServiceException;

public class IncidenciaController implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	private IncidenciaBackingBean incidenciaBackingBean;

	@Autowired
	private IncidenciaService incidenciaService;

	@Autowired
	private UsuarioController usuarioController;

	@Autowired
	private AulaService aulaService;

	@Autowired
	private LaboratorioService laboratorioService;

	private Incidencia incidencia = new Incidencia();
	private List<Incidencia> incidencias = new ArrayList<Incidencia>();
	private List<SelectItem> cursos = new ArrayList<SelectItem>();

	// Datos de la busqueda avanzada
	private String busqAula;
	private String busqUsuario;
	private String estadoIncidencia;
	private boolean frecuentes;
	private boolean comentados;
	// fin de datos de la busqueda avanzada

	private String numero;
	private String tipoAula = "aula";
	private String busqueda;
	private boolean panelBusquedaAvanzada;

	public IncidenciaController() {
		incidencia.setFechaRegistro(new Date());
		panelBusquedaAvanzada = false;
		iniciarBusqueda();
	}

	@PostConstruct
	private void cargar() {
		try {
			this.incidencias = this.incidenciaService.listarIncidencias();
		} catch (ServiceException e) {
			e.printStackTrace();
		}

	}

	public Incidencia getIncidencia() {
		return incidencia;
	}

	public void setIncidencia(Incidencia incidencia) {
		this.incidencia = incidencia;
	}

	public List<Incidencia> getIncidencias() {
		return incidencias;
	}

	public void setIncidencias(List<Incidencia> incidencias) {
		this.incidencias = incidencias;
	}

	public IncidenciaBackingBean getIncidenciaBackingBean() {
		return incidenciaBackingBean;
	}

	public void setIncidenciaBackingBean(
			IncidenciaBackingBean incidenciaBackingBean) {
		this.incidenciaBackingBean = incidenciaBackingBean;
	}

	public void registrar() {
		boolean valido = true;
		if (incidencia.getTitulo().isEmpty()) {
			mensaje("Campos Incompletos", "Complete el titulo de la incidencia");
			valido = false;
		}
		if (incidencia.getTipo() == ' ') {
			mensaje("Campos Incompletos",
					"Seleccione al menos un tipo de Incidencia");
			valido = false;
		}
		if (incidencia.getFechaRegistro() == null) {
			mensaje("Campos Incompletos",
					"Seleccione la fecha de registro de Incidencia");
			valido = false;
		}
		if (numero.isEmpty()) {
			mensaje("Campos Incompletos", "Ingrese aula o laboratorio");
			valido = false;
		}
		if ("".equals(incidencia.getDescripcion())) {
			mensaje("Campos Incompletos", "Ingrese la Descripcion");
			valido = false;
		}
		if (incidencia.getTitulo().length() >= 100) {
			mensaje("Campo Demasia Largo",
					"El titulo tiene que tener como maximo 100 caracteres");
			valido = false;
		}
		if (usuarioController.getDocente() != null) {
			if (incidencia.getNombreCurso().isEmpty()) {
				mensaje("Elija curso", "Debe seleccionar alguno de sus cursos");
				valido = false;
			}
		}

		if (valido) {
			try {
				if (tipoAula.equals("aula")) {
					Aula aulaS = aulaService.obtenerAula(numero);
					if (aulaS == null) {
						mensaje("No encontrado", "El numero del aula no existe");
					} else {
						incidencia.setAula(aulaS);
					}
				} else {
					Laboratorio laboratorioS = laboratorioService
							.obtenerLaboratorio(numero);
					if (laboratorioS == null) {
						mensaje("No encontrado",
								"El numero del laboratorio no existe");
					} else {
						incidencia.setLaboratorio(laboratorioS);
					}
				}

				incidencia.setUsuario(usuarioController.getUsuario());
				incidencia.setEstado('n');// NUEVO
				incidenciaService.guardarIncidencia(incidencia);
				mensaje("Exito al Guardar",
						"Se registro con exito la incidencia");
				incidencia = new Incidencia();
				incidencia.setFechaRegistro(new Date());

				numero = "";
				cursos = new ArrayList<SelectItem>();

			} catch (ServiceException e) {
				e.printStackTrace();
				mensaje("Error al guardar",
						"Ocurrio un error al guardar, intentelo mas tarde");
			}
		}

	}

	public void cancelar() {
		try {

			FacesContext contex = FacesContext.getCurrentInstance();
			contex.getExternalContext().redirect(
					"/sisclas/pages/listaIncidencias.jsf");
			incidencia = new Incidencia();
			numero = "";
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void onRowEdit(RowEditEvent event) throws ServiceException {
		try {
			incidenciaService.ActualizarIncidencia(
					((Incidencia) event.getObject()).getTitulo(),
					((Incidencia) event.getObject()).getEstado());
		} catch (ServiceException e) {
			mensaje("Error", e.getMessage());
		}
	}

	public void onRowCancel(RowEditEvent event) {
	}

	private void mensaje(String ttl, String msj) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(ttl, msj));
	}

	public void buscarSimple() {
		// if(!busqueda.isEmpty()){
		try {
			incidencias = incidenciaService.listarPorTitulo(busqueda);
		} catch (ServiceException e) {
			e.printStackTrace();
		}
		// }
	}

	public void busquedaAvanzada() {
		Incidencia busq = new Incidencia();
		busq.setAula(new Aula(0, busqAula));
		busq.setEstado(estadoIncidencia.charAt(0));
		busq.setUsuario(new Usuario(0, "", busqUsuario));
		try {
			incidencias = incidenciaService.listarPorFiltro(busq, frecuentes,
					comentados);
		} catch (ServiceException e) {
			e.printStackTrace();
		}
	}

	private void iniciarBusqueda() {
		busqAula = "";
		busqUsuario = "";
		estadoIncidencia = "";
		frecuentes = false;
		comentados = false;
	}

	public IncidenciaService getIncidenciaService() {
		return incidenciaService;
	}

	public void setIncidenciaService(IncidenciaService incidenciaService) {
		this.incidenciaService = incidenciaService;
	}

	public UsuarioController getUsuarioController() {
		return usuarioController;
	}

	public void setUsuarioController(UsuarioController usuarioController) {
		this.usuarioController = usuarioController;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getTipoAula() {
		return tipoAula;
	}

	public void setTipoAula(String tipoAula) {
		this.tipoAula = tipoAula;
	}

	public String getBusqueda() {
		return busqueda;
	}

	public void setBusqueda(String busqueda) {
		this.busqueda = busqueda;
	}

	public boolean isPanelBusquedaAvanzada() {
		return panelBusquedaAvanzada;
	}

	public void setPanelBusquedaAvanzada(boolean panelBusquedaAvanzada) {
		this.panelBusquedaAvanzada = panelBusquedaAvanzada;
	}

	public String getBusqAula() {
		return busqAula;
	}

	public void setBusqAula(String busqAula) {
		this.busqAula = busqAula;
	}

	public String getBusqUsuario() {
		return busqUsuario;
	}

	public void setBusqUsuario(String busqUsuario) {
		this.busqUsuario = busqUsuario;
	}

	public String getEstadoIncidencia() {
		return estadoIncidencia;
	}

	public void setEstadoIncidencia(String estadoIncidencia) {
		this.estadoIncidencia = estadoIncidencia;
	}

	public boolean isFrecuentes() {
		return frecuentes;
	}

	public void setFrecuentes(boolean frecuentes) {
		this.frecuentes = frecuentes;
	}

	public boolean isComentados() {
		return comentados;
	}

	public void setComentados(boolean comentados) {
		this.comentados = comentados;
	}

	public List<SelectItem> getCursos() {
		if (this.cursos.isEmpty()) {
			SelectItem cursoLista;
			for (Curso curso : this.usuarioController.getDocente().getCursos()) {
				cursoLista = new SelectItem(curso.getNombreCurso(),
						curso.getNombreCurso());
				cursos.add(cursoLista);
			}
		}
		return cursos;
	}
}
